home *** CD-ROM | disk | FTP | other *** search
/ STraTOS 1997 April & May / STraTOS 1 - 1997 April & May.iso / CD01 / INTERNET / SITES / LITTLE / BMSRC.ZIP / SHARDS.S < prev    next >
Encoding:
Text File  |  1996-06-23  |  14.5 KB  |  544 lines

  1. *=======================================================*
  2. *    Shards: latest update 25/03/96            *
  3. *=======================================================*
  4. *    Interface with DSP to retrieve floors & walls    *
  5. *=======================================================*
  6.  
  7. *-------------------------------------------------------*
  8. *    WARNING:                    *
  9. *-------------------------------------------------------*
  10. *    This is the least finished module of the 3D    *
  11. *    core, and the most volatile beside the DSP    *
  12. *    module itself. Altering it could be a very    *
  13. *    bad idea. Please wait until I have finished    *
  14. *    writing it!                    *
  15. *-------------------------------------------------------*
  16.  
  17. sz1        =    64        ; sample z1
  18. sz2        =    128        ; sample z2
  19.  
  20. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  21. *    Generate a new wall, floor & ceiling chunk    *
  22. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  23.     txtlong
  24. *-------------------------------------------------------*
  25. add_wall_segment:
  26. *-------------------------------------------------------*
  27.     move.w        peg,d0
  28.     add.w        sidedef_yoff(a3),d0
  29.     add.w        d0,d0
  30.     move.w        d0,voff
  31.  
  32.     move.w        sidedef_xoff(a3),d0
  33.     add.w        x_offset,d0
  34.     move.w        d0,uoff
  35. *-------------------------------------------------------*
  36.     pea        (a3)
  37.     pea        (a4)
  38. *-------------------------------------------------------*
  39.  
  40.  
  41.  
  42.     lea        DSPHostStat.w,a4
  43.     lea        DSPHost32.w,a5
  44. *-------------------------------------------------------*
  45.     move.l        addwall_z1(a6),d1
  46.     move.l        addwall_z2(a6),d2
  47.     move.l        d1,addwall_pz1(a6)
  48.     move.l        d2,addwall_pz2(a6)
  49.  
  50.     sub.l        d1,d2
  51.     bpl.s        .ak1
  52.     neg.l        d2
  53. .ak1:    lsr.l        #7,d1
  54.     cmp.l        d1,d2
  55.     bpl.s        .ak2
  56.  
  57.     move.l        addwall_pz2(a6),d1
  58.     move.l        d1,addwall_pz2(a6)
  59.     move.l        d1,addwall_rz1(a6)
  60.     add.l        #2000<<16,d1
  61.     move.l        d1,addwall_pz1(a6)
  62.     move.l        d1,addwall_rz2(a6)
  63.  
  64.     dspwrite.b    #linear_command,(a4)
  65.     bra.s        .lin
  66.     
  67. .ak2:    dspwrite.b    #perspected_command,(a4)
  68. .lin:    move.l        addwall_pz1(a6),addwall_t2(a6)
  69.     move.l        addwall_pz2(a6),addwall_t1(a6)
  70.  
  71. *-------------------------------------------------------*
  72.     moveq        #0,d6
  73.     move.w        addwall_hhig(a6),d6    ; (h/2)
  74.     moveq        #0,d0
  75.     move.w        addwall_vscale(a6),d0    ; vscale
  76.     swap        d0
  77.     swap        d6    
  78. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  79. *    Vertical (y) perspective projection        *
  80. *~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*
  81. *    y' = y * ( (w/2) / z ) + (h/2)            *
  82. *-------------------------------------------------------*
  83.     move.l        addwall_y1(a6),d1
  84.     move.l        d0,d2
  85.     muls.l        d1,d7:d2
  86.     divs.l        addwall_z1(a6),d7:d2
  87.     add.l        d6,d2
  88.     move.l        d0,d5
  89.     muls.l        d1,d7:d5
  90.     divs.l        addwall_z2(a6),d7:d5
  91.     move.l        addwall_y2(a6),d1
  92.     add.l        d6,d5
  93.     move.l        d0,d3
  94.     muls.l        d1,d7:d3
  95.     divs.l        addwall_z1(a6),d7:d3
  96.     add.l        d6,d3
  97.     move.l        d0,d4
  98.     muls.l        d1,d7:d4
  99.     divs.l        addwall_z2(a6),d7:d4
  100.     add.l        d6,d4
  101. *-------------------------------------------------------*
  102. *    Calculate dy1 & dy2 gradients            *    
  103. *-------------------------------------------------------*
  104.     move.l        addwall_i2(a6),d0
  105.     sub.l        addwall_i1(a6),d0
  106.     sub.l        d2,d5
  107.     swap        d5
  108.     move.w        d5,d6
  109.     ext.l        d6
  110.     clr.w        d5
  111.     divs.l        d0,d6:d5    ; dy1 = (ry1-ly1) / (x2-x1)
  112.     move.l        d4,d1
  113.     sub.l        d3,d1
  114.     swap        d1
  115.     move.w        d1,d6
  116.     ext.l        d6
  117.     clr.w        d1
  118.     divs.l        d0,d6:d1    ; dy2 = (ry2-ly2) / (x2-x1)
  119. *-------------------------------------------------------*
  120. *    Calculate dz gradient                *
  121. *-------------------------------------------------------*
  122.     move.l        addwall_t2(a6),d4
  123.     sub.l        addwall_t1(a6),d4
  124.     swap        d4
  125.     move.w        d4,d6
  126.     clr.w        d4
  127.     ext.l        d6
  128.     divs.l        d0,d6:d4
  129.     move.l        d4,addwall_ti(a6)
  130. *-------------------------------------------------------*
  131. *    Clip wall against left edge            *    
  132. *-------------------------------------------------------*
  133.     move.l        addwall_i1(a6),d7
  134.     move.l        d7,d6
  135.     swap        d6
  136.     ext.l        d6
  137.     bpl.s        .ok1
  138.     moveq        #0,d6
  139. .ok1:    move.l        d6,a3
  140.  
  141.     swap        d6
  142.     sub.l        d6,d7    
  143.     move.l        d7,a2
  144.  
  145.     move.l        a2,d6
  146.     clr.w        d6
  147.     muls.l        d5,d7:d6
  148.     move.w        d7,d6
  149.     swap        d6
  150.     sub.l        d6,d2        ; y1 = y1 - (x1*dy1)
  151.  
  152.     move.l        a2,d6
  153.     clr.w        d6
  154.     muls.l        d1,d7:d6
  155.     move.w        d7,d6
  156.     swap        d6
  157.     sub.l        d6,d3        ; y2 = y2 - (x1*dy2)
  158.  
  159.     move.l        addwall_t2(a6),d6
  160.     sub.l        addwall_t1(a6),d6    ; (t2-t1)
  161.     move.l        a2,d0
  162.     muls.l        d0,d7:d6        ; (t2-t1) * x1
  163.     move.l        addwall_i2(a6),d0
  164.     sub.l        addwall_i1(a6),d0    ; (x2-x1)
  165.     divs.l        d0,d7:d6        ; (x1*dz) = ((t2-t1) * x1) / (x2-x1)
  166.     move.l        addwall_t1(a6),d0
  167.     sub.l        d6,d0            ; z1 = z1 - (x1*dz)
  168.     move.l        d0,addwall_t1(a6)
  169.     move.l        a3,d7
  170.  
  171. *-------------------------------------------------------*
  172. *    Load results into local loop registers        *    
  173. *-------------------------------------------------------*
  174.     move.l        d2,addwall_y1a(a6)
  175.     move.l        d3,addwall_y2a(a6)
  176.     move.l        d5,addwall_y1i(a6)
  177.     move.l        d1,addwall_y2i(a6)
  178. *-------------------------------------------------------*
  179.  
  180.     move.l        umag,d6
  181.  
  182.     move.l        addwall_rz2(a6),d1
  183.     sub.l        addwall_rz1(a6),d1
  184.  
  185.     move.l        addwall_pz2(a6),d0
  186.     sub.l        addwall_rz1(a6),d0
  187.  
  188.     
  189.     muls.l        d6,d2:d0
  190.  
  191.     divs.l        d1,d2:d0
  192.     move.l        d0,addwall_tu2(a6)
  193.  
  194.     move.l        addwall_pz1(a6),d0
  195.     sub.l        addwall_rz1(a6),d0
  196.  
  197.     muls.l        d6,d2:d0
  198.  
  199.     divs.l        d1,d2:d0
  200.     move.l        d0,addwall_tu1(a6)
  201.  
  202. *-------------------------------------------------------*
  203. *    Clip wall against right edge            *
  204. *-------------------------------------------------------*
  205.     move.w        addwall_i2(a6),d6
  206.     move.w        addwall_width(a6),d0
  207.     cmp.w        d0,d6
  208.     bmi.s        .x2in
  209.     move.w        d0,d6
  210. .x2in:    move.w        d6,addwall_ci2(a6)
  211. *-------------------------------------------------------*
  212.  
  213. ;    cmp.b        #UPPER_TYPE,addwall_type(a6)
  214. ;    beq.s        .upper
  215. ;    cmp.b        #LOWER_TYPE,addwall_type(a6)
  216. ;    beq.s        .lower
  217. ;.wall:    moveq        #wall_command,d0
  218. ;    bra.s        .go
  219. ;.upper:    moveq        #upper_command,d0
  220. ;    bra.s        .go
  221. ;.lower:    moveq        #lower_command,d0
  222. ;.go:    dspwrite.b    d0,(a4)
  223.  
  224.     dspwrite.b    addwall_type(a6)
  225.  
  226. xxx:    lea        DSPHostStat.w,a2
  227.  
  228.     dspwrite.r    addwall_y1a(a6),(a4)
  229.     dspwrite.r    addwall_y1i(a6),(a4)
  230.     dspwrite.r    addwall_y2a(a6),(a4)
  231.     dspwrite.r    addwall_y2i(a6),(a4)
  232.     dspwrite.r    addwall_t1(a6),(a4)
  233.     dspwrite.r    addwall_ti(a6),(a4)
  234.     dspwrite.r    addwall_pz2(a6),(a4)
  235.     dspwrite.r    addwall_pz1(a6),(a4)
  236.  
  237.  
  238.     moveq        #0,d1
  239.     moveq        #0,d2
  240.     move.w        wall_id,d0
  241.     bmi.s        .err
  242.     move.l        graphics_array,a0
  243.     move.l        (a0,d0.w*4),a0
  244.     move.w        tex_width(a0),d1
  245.     move.w        tex_height(a0),d2
  246. .err:
  247.     dspwrite.l    d1,(a4)
  248.     dspwrite.l    d2,(a4)
  249.  
  250.     move.l        addwall_tu2(a6),d0
  251.     sub.l        addwall_tu1(a6),d0
  252.     asr.l        #8,d0
  253.     dspwrite.l    d0,(a4)            ; umag
  254.  
  255.     move.l        addwall_tu1(a6),d0
  256.  
  257.     move.l        umag,d6
  258.     sub.l        d6,d0
  259.  
  260.     moveq        #0,d6
  261.     move.w        uoff,d6
  262.     swap        d6
  263.     sub.l        d6,d0
  264.     asr.l        #8,d0
  265.  
  266.     dspwrite.l    d0,(a4)            ; uclip
  267.  
  268.     move.l        addwall_y2(a6),d0
  269.     sub.l        addwall_y1(a6),d0
  270.     swap        d0
  271.     ext.l        d0
  272.     dspwrite.l    d0,(a4)            ; vmag
  273.  
  274.     moveq        #0,d0
  275.     move.w        voff,d0
  276.     dspwrite.l    d0,(a4)
  277.     
  278.     moveq        #0,d0
  279.     dspwrite.l    d7,(a4)
  280.     move.w        addwall_ci2(a6),d0
  281.     dspwrite.l    d0,(a4)
  282.  
  283.     move.b        addwall_opaque(a6),d0
  284.     dspwrite.l    d0,(a4)
  285.  
  286.     move.w        display_columns(a6),d0
  287.     dspwrite.l    d0,(a4)
  288.  
  289. yyy:    pushall
  290. *-------------------------------------------------------*
  291.     bsr        render_wall
  292. *-------------------------------------------------------*
  293.     moveq        #0,d5
  294.     move.w        d5,wallruncount
  295. *-------------------------------------------------------*
  296.     popall
  297. *-------------------------------------------------------*
  298.     dspread.w    display_columns(a6)
  299. *-------------------------------------------------------*
  300.     pop.l        a4
  301.     pop.l        a3
  302.     rts
  303.  
  304. voff:            dc.w    0
  305. uoff:            dc.w    0
  306.  
  307. umag:            ds.l    1
  308.     
  309. cz1:    ds.l        1
  310. cz2:    ds.l        1
  311. fz1:    ds.l        1
  312. fz2:    ds.l        1
  313.  
  314. *-------------------------------------------------------*
  315.     txtlong
  316. *-------------------------------------------------------*
  317. get_ssector:
  318. *-------------------------------------------------------*
  319.     push.l        a6
  320. *-------------------------------------------------------*
  321.     lea        DSPHost16.w,a1
  322.     lea        DSPHost32.w,a5
  323.     lea        DSPHostStat.w,a2
  324. *-------------------------------------------------------*
  325.     move.w        sky_index,d5
  326.     moveq        #getssector_command,d0
  327.     dspwaitwrite.0    (a2)
  328.     move.w        d0,(a1)
  329.     move.w        display_ph(a6),d6
  330.     sub.w        display_ch(a6),d6 
  331.     cmp.w        display_ct(a6),d5
  332.     bne.s        .no_upper_sky
  333.     move.w        #upper_sky_dist,d6
  334. .no_upper_sky:
  335.     dspwaitwrite.0    (a2)
  336.     move.w        d6,(a1)
  337.     move.w        display_ph(a6),d7
  338.     sub.w        display_fh(a6),d7 
  339.     cmp.w        display_ft(a6),d5
  340.     bne.s        .no_lower_sky
  341.     move.w        #lower_sky_dist,d7
  342. .no_lower_sky:
  343.     dspwaitwrite.0    (a2)
  344.     move.w        d7,(a1)
  345. *-------------------------------------------------------*
  346. *    Set up luminance, texture indexes & horizon    *    
  347. *-------------------------------------------------------*
  348.     move.w        #256-1,d4
  349.     move.l        zone_ptr,a4
  350.     move.w        display_ct(a6),d0
  351.     bsr.s        stack_floor
  352.     move.w        display_ft(a6),d0
  353.     bsr.s        stack_floor
  354. *-------------------------------------------------------*
  355. *    Terminate floor stack                *
  356. *-------------------------------------------------------*
  357.     move.l        a4,zone_ptr
  358.     clr.b        (a4)
  359. *-------------------------------------------------------*
  360.     pop.l        a6
  361. *-------------------------------------------------------*
  362.     rts
  363.  
  364. *-------------------------------------------------------*
  365. *    Retrieve all scanlines for this ssector        *
  366. *-------------------------------------------------------*
  367.     txtlong
  368. *-------------------------------------------------------*
  369. stack_floor:
  370. *-------------------------------------------------------*
  371. *    Create zone header (skip null zones)         *
  372. *-------------------------------------------------------*
  373.     dspwaitread.0    (a2)
  374.     move.w        (a1),d1
  375.     dspwaitread.0    (a2)
  376.     move.w        (a1),d7
  377.     beq        null_zone
  378. *-------------------------------------------------------*
  379.     move.b        d7,(a4)+            ; zone_lines
  380.     subq.w        #1,d7
  381.     move.b        d0,(a4)+            ; zone_texture
  382.     move.w        d1,(a4)+            ; zone_start
  383. *-------------------------------------------------------*
  384. .line_loop:
  385. *-------------------------------------------------------*
  386. *    Create line header (null lines must be added)    *
  387. *-------------------------------------------------------*
  388.     dspwaitread.0    (a2)
  389.     move.w        (a1),d0
  390.     move.w        d0,(a4)+            ; line_runs
  391.     subq.w        #1,d0
  392.     bmi.s        .null_line
  393. *-------------------------------------------------------*
  394.     dspwaitread.2    (a2)
  395.     move.w        (a1),d3
  396. *-------------------------------------------------------*
  397. .run_loop:
  398. *-------------------------------------------------------*
  399.     move.w        d3,(a4)+
  400.     dspwaitread.0    (a2)
  401.     move.w        (a1),(a4)+
  402. *-------------------------------------------------------*
  403.     dbra        d0,.run_loop
  404. *-------------------------------------------------------*
  405. .null_line:
  406. *-------------------------------------------------------*
  407.     dbra        d7,.line_loop    
  408. *-------------------------------------------------------*
  409. null_zone:
  410. *-------------------------------------------------------*
  411.     rts
  412.  
  413. *-------------------------------------------------------*
  414. stack_transparent:
  415. *-------------------------------------------------------*
  416. *    Check for bad wall texture            *
  417. *-------------------------------------------------------*
  418.     lea        DSPHostStat.w,a3
  419.     move.l        transparent_array,a6
  420.     lea        DSPHost16.w,a1
  421.     lea        DSPHost32.w,a2
  422. *-------------------------------------------------------*
  423. *    Start column retrieval                *
  424. *-------------------------------------------------------*
  425.     moveq        #-1,d7
  426.     dspwaitread.0    (a3)
  427.     move.w        (a1),d3                ; i
  428.     bmi        .dsp_done
  429. *-------------------------------------------------------*
  430. *    Retrieval loop                    *
  431. *-------------------------------------------------------*
  432. .next:    move.w        d3,(a6)+
  433.     dspwaitread.0    (a3)
  434.     move.w        (a1),(a6)+            ; j1j2
  435.     dspwaitread.0    (a3)
  436.     move.w        (a1),(a6)+            ; lum
  437.     dspwaitread.0    (a3)
  438.     move.w        (a1),(a6)+            ; u
  439.     dspwaitread.0    (a3)
  440.     move.l        (a2),(a6)+            ; dv[i:f]
  441.     dspwaitread.0    (a3)
  442.     move.w        (a1),(a6)+            ; v
  443.     addq.l        #1,d7
  444.     dspwaitread.0    (a3)
  445.     move.w        (a1),d3                ; i
  446.     bpl.s        .next
  447. *-------------------------------------------------------*
  448. *    Store texture index                *
  449. *-------------------------------------------------------*
  450.     move.w        wall_id,(a6)+
  451. *-------------------------------------------------------*
  452. *    Store column count                *
  453. *-------------------------------------------------------*
  454.     move.w        d7,(a6)+
  455. *-------------------------------------------------------*
  456. *    Update array pointer & counter            *
  457. *-------------------------------------------------------*
  458.     move.l        a6,transparent_array
  459.     addq.w        #1,transparent_count
  460. *-------------------------------------------------------*
  461. *    All columns for this wall are complete        *
  462. *-------------------------------------------------------*
  463. .dsp_done:
  464. *-------------------------------------------------------*
  465.     rts
  466.  
  467. *-------------------------------------------------------*
  468. flush_badwall:
  469. *-------------------------------------------------------*
  470. *    Check for bad wall texture            *
  471. *-------------------------------------------------------*
  472.     lea        DSPHostStat.w,a3
  473.     lea        DSPHost16.w,a1
  474.     lea        DSPHost32.w,a2
  475. *-------------------------------------------------------*
  476. *    Start column retrieval                *
  477. *-------------------------------------------------------*
  478.     dspwaitread.0    (a3)
  479.     tst.w        (a1)                ; i
  480.     bmi        .dsp_done
  481. *-------------------------------------------------------*
  482. *    Retrieval loop                    *
  483. *-------------------------------------------------------*
  484. .next:    dspwaitread.0    (a3)
  485.     tst.w        (a1)                ; j1j2
  486.     dspwaitread.0    (a3)
  487.     tst.w        (a1)                ; lum
  488.     dspwaitread.0    (a3)
  489.     tst.w        (a1)                ; u
  490.     dspwaitread.0    (a3)
  491.     tst.l        (a2)                ; dv[i:f]
  492.     dspwaitread.0    (a3)
  493.     tst        (a1)                ; v
  494.     dspwaitread.0    (a3)
  495.     tst.w        (a1)                ; i
  496.     bpl.s        .next
  497. *-------------------------------------------------------*
  498. .dsp_done:
  499. *-------------------------------------------------------*
  500.     rts
  501.     
  502. *-------------------------------------------------------*
  503. kickstart_doomcore:
  504. *-------------------------------------------------------*
  505.     jsr        IsDspDrv
  506.     dspexec        DoomCore
  507.     rts
  508.  
  509. *-------------------------------------------------------*
  510.     include        include\dsplib.s
  511. *-------------------------------------------------------*
  512.  
  513. *-------------------------------------------------------*
  514.             datlong
  515. *-------------------------------------------------------*
  516.  
  517. DoomCore:        incbin    "doom.dsp'
  518. DoomCore_e:
  519.  
  520. *-------------------------------------------------------*
  521.             bsslong
  522. *-------------------------------------------------------*
  523.  
  524. zone_ptr:        ds.l    1
  525. transparent_array:    ds.l    1
  526.  
  527. maxy:            ds.w    320            ; upper clipping buffer.
  528. miny:            ds.w    320            ; lower clipping buffer.
  529. occlusion_list:        ds.b    320            ; byte-per-column occlusion list.
  530.  
  531. ;addwall_struct:        ds.b    addwall_len        ; local variables for AddWall.
  532.  
  533. transparent_count:    ds.w    1
  534. wallruncount:        ds.w    1            ; counter for total wall runs.
  535.  
  536. dummy_zone:        ds.b    16
  537. zone_space:        ds.b    256000
  538.  
  539. transparent_space:    ds.b    14*2048
  540.  
  541. *-------------------------------------------------------*
  542.             txtlong
  543. *-------------------------------------------------------*
  544.